/**
 * Software License, Version 1.0
 * 
 * Copyright 2003 The Trustees of Indiana University.  All rights reserved.
 * 
 *
 *Redistribution and use in source and binary forms, with or without 
 *modification, are permitted provided that the following conditions are met:
 *
 *1) All redistributions of source code must retain the above copyright notice,
 * the list of authors in the original source code, this list of conditions and
 * the disclaimer listed in this license;
 *2) All redistributions in binary form must reproduce the above copyright 
 * notice, this list of conditions and the disclaimer listed in this license in
 * the documentation and/or other materials provided with the distribution;
 *3) Any documentation included with all redistributions must include the 
 * following acknowledgement:
 *
 *"This product includes software developed by the Community Grids Lab. For 
 * further information contact the Community Grids Lab at 
 * http://communitygrids.iu.edu/."
 *
 * Alternatively, this acknowledgement may appear in the software itself, and 
 * wherever such third-party acknowledgments normally appear.
 * 
 *4) The name Indiana University or Community Grids Lab or NaradaBrokering, 
 * shall not be used to endorse or promote products derived from this software 
 * without prior written permission from Indiana University.  For written 
 * permission, please contact the Advanced Research and Technology Institute 
 * ("ARTI") at 351 West 10th Street, Indianapolis, Indiana 46202.
 *5) Products derived from this software may not be called NaradaBrokering, 
 * nor may Indiana University or Community Grids Lab or NaradaBrokering appear
 * in their name, without prior written permission of ARTI.
 * 
 *
 * Indiana University provides no reassurances that the source code provided 
 * does not infringe the patent or any other intellectual property rights of 
 * any other entity.  Indiana University disclaims any liability to any 
 * recipient for claims brought by any other entity based on infringement of 
 * intellectual property rights or otherwise.  
 *
 *LICENSEE UNDERSTANDS THAT SOFTWARE IS PROVIDED "AS IS" FOR WHICH NO 
 *WARRANTIES AS TO CAPABILITIES OR ACCURACY ARE MADE. INDIANA UNIVERSITY GIVES
 *NO WARRANTIES AND MAKES NO REPRESENTATION THAT SOFTWARE IS FREE OF 
 *INFRINGEMENT OF THIRD PARTY PATENT, COPYRIGHT, OR OTHER PROPRIETARY RIGHTS. 
 *INDIANA UNIVERSITY MAKES NO WARRANTIES THAT SOFTWARE IS FREE FROM "BUGS", 
 *"VIRUSES", "TROJAN HORSES", "TRAP DOORS", "WORMS", OR OTHER HARMFUL CODE.  
 *LICENSEE ASSUMES THE ENTIRE RISK AS TO THE PERFORMANCE OF SOFTWARE AND/OR 
 *ASSOCIATED MATERIALS, AND TO THE PERFORMANCE AND VALIDITY OF INFORMATION 
 *GENERATED USING SOFTWARE.
 */
package cgl.narada.service.security.impl;

import java.security.PrivateKey;
import java.util.Properties;

import javax.crypto.SecretKey;

import cgl.narada.event.NBEvent;
import cgl.narada.event.impl.NBEventGenerator;
import cgl.narada.service.ServiceException;

public class EntitySecurityService {
  NBEventGenerator nbEventGenerator;
  EntityOperationsImpl entityOperationsImpl;
  EntityKeyManagementImpl entityKeyManagementImpl;
  
  public EntitySecurityService()  throws ServiceException {
    nbEventGenerator = new NBEventGenerator();
    entityOperationsImpl = new EntityOperationsImpl();
    entityKeyManagementImpl = new EntityKeyManagementImpl();
  }
  
  /** Mode, Padding, provider */
  public void encryptContentPayload(NBEvent nbEvent, Properties props) 
    throws ServiceException {
    
    int templateId = nbEvent.getEventHeaders().getTemplateId();
    
    SecretKey secretKey = entityKeyManagementImpl.getTemplateKey(templateId);

    String mode = props.getProperty("mode");
    String paddingScheme = props.getProperty("padding");
    String provider = props.getProperty("provider");

    String personalKeyStore = props.getProperty("personalKeyLocation");
    String alias = props.getProperty("PersonalKeyPairAlias");
    //String signature = props.getProperty("signature");
    String signatureAlgorithm = props.getProperty("signatureAlgorithm");


    byte[] contentPayload = nbEvent.getContentPayload();
    
    byte[] iv = entityOperationsImpl.getIV(secretKey, mode, paddingScheme, 
					   provider);
    
    
    byte[] securePayload = 
      entityOperationsImpl.encryptPayload(secretKey, mode, paddingScheme, 
					  provider, contentPayload, iv);
    
    PrivateKey privateKey = 
      entityKeyManagementImpl.getPersonalPrivateKey(alias);
								  
    byte[] signature = 
      entityOperationsImpl.signPayload(privateKey, signatureAlgorithm, 
				       provider, securePayload);

    nbEventGenerator.updateEncryptedPayloadInformation(nbEvent, securePayload,
						       iv, mode, 
						       paddingScheme);

    nbEventGenerator.updateSignatureInformation(nbEvent, signatureAlgorithm,
						signature);
    
  }
  
  /** Throw a service exception if the digest is not right or if the
      signature isn't right. Finally, simply replace the encryptedPayload
      with the normal payload and release. */
  public void decryptContentPayload(NBEvent nbEvent) {
    
    
  }
  
  
}

